var Analytics = function () {

  const GA_ENDPOINT = 'https://www.google-analytics.com/mp/collect';
  const GA_DEBUG_ENDPOINT = 'https://www.google-analytics.com/debug/mp/collect';
  
  // Get via https://developers.google.com/analytics/devguides/collection/protocol/ga4/sending-events?client_type=gtag#recommended_parameters_for_reports
  const MEASUREMENT_ID = 'G-JKZ4HZ2QH0';
  const API_SECRET = '0Jrn8FYmQMiZ3p6z-uhq6g';
  const DEFAULT_ENGAGEMENT_TIME_MSEC = 100;
  
  // Duration of inactivity after which a new session is created
  const SESSION_EXPIRATION_IN_MIN = 30;
  

  this.getOrCreateClientId = function() {
    let clientId  = localStorage.getItem('clientId');
    if (!clientId) {
      // Generate a unique client ID, the actual value is not relevant
      clientId = self.crypto.randomUUID();
      localStorage.setItem("clientId", clientId)
    }
    // console.log("clientId", clientId);
    return clientId;
  }


   // Returns the current session id, or creates a new one if one doesn't exist or
  // the previous one has expired.
  // this.getOrCreateSessionId = function(){
  //   // Use storage.session because it is only in memory
  //   let sessionData = localStorage.getItem('sessionData');
  //   const currentTimeInMs = Date.now();
  //   // Check if session exists and is still valid
  //   if (sessionData && sessionData.timestamp) {
  //     // Calculate how long ago the session was last updated
  //     const durationInMin = (currentTimeInMs - sessionData.timestamp) / 60000;
  //     // Check if last update lays past the session expiration threshold
  //     if (durationInMin > SESSION_EXPIRATION_IN_MIN) {
  //       // Clear old session id to start a new session
  //       sessionData = null;
  //     } else {
  //       // Update timestamp to keep session alive
  //       sessionData.timestamp = currentTimeInMs;
  //       await chrome.storage.session.set({ sessionData });
  //     }
  //   }
  //   if (!sessionData) {
  //     // Create and store a new session
  //     sessionData = {
  //       session_id: currentTimeInMs.toString(),
  //       timestamp: currentTimeInMs.toString()
  //     };
  //     await chrome.storage.session.set({ sessionData });
  //   }
  //   return sessionData.session_id;
  // }

  // Fires an event with optional params. Event names must only include letters and underscores.
  this.fireEvent = function (name, params = {}) {
    // Configure session id and engagement time if not present, for more details see:
    // https://developers.google.com/analytics/devguides/collection/protocol/ga4/sending-events?client_type=gtag#recommended_parameters_for_reports
    // if (!params.session_id) {
    //   params.session_id = await this.getOrCreateSessionId();
    // }
    if (!params.engagement_time_msec) {
      params.engagement_time_msec = DEFAULT_ENGAGEMENT_TIME_MSEC;
    }

    try {
      fetch(
        `${GA_ENDPOINT}?measurement_id=${MEASUREMENT_ID}&api_secret=${API_SECRET}`,
        {
          method: 'POST',
          body: JSON.stringify({
            client_id: this.getOrCreateClientId(),
            events: [
              {
                name,
                params
              }
            ]
          })
        }
      );      
    } catch (e) {
      console.error('Google Analytics request failed with an exception', e);
    }
  }

   // Fire a page view event.
   this.firePageViewEvent = function (pageTitle, pageLocation, additionalParams = {}) {
    return this.fireEvent('page_view', {
      page_title: pageTitle,
      page_location: pageLocation,
      ...additionalParams
    });
  }
}

var Analytics = new Analytics();